package org.study.enums;

import java.util.EnumMap;
import java.util.EnumSet;

/**
 * 参考 https://blog.csdn.net/MeyrlNotFound/article/details/147870300
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2025年07月16日
 */
public class SeasonEnumTest {
    public static void main(String[] args) {
        // test01();
        // test02();
        // test03();
        test04();
    }

    public static void test01() {
        // 声明枚举类后，可以通过枚举类名直接访问其常量
        Season current = Season.SUMMER;
        System.out.println(current);
    }

    public static void test02() {
        // 所有枚举类都隐式继承了java.lang.Enum类，因此可以使用Enum类中定义的方法
        // name()：返回枚举常量的名称（与声明时相同）
        System.out.println(Season.SPRING.name());

        // ordinal()：返回枚举常量的序数（声明时的位置，从0开始）
        System.out.println(Season.SUMMER.ordinal());

        // values()：返回包含所有枚举常量的数组（按声明顺序）
        for (Season s : Season.values()) {
            System.out.println(s);
        }

        // valueOf(String)：根据名称返回对应的枚举常量
        Season s = Season.valueOf("WINTER");
        System.out.println(s);
    }

    public static void test03() {
        Season season = Season.SUMMER;
        // 枚举类与switch语句配合使用非常自然，这也是枚举类的一个重要应用场景
        // 注意在switch语句中使用枚举常量时，不需要写全限定名（不需要写Season.SPRING，只需写SPRING）
        switch (season) {
            case SPRING:
                System.out.println("春暖花开");
                break;
            case SUMMER:
                System.out.println("夏日炎炎");
                break;
            case AUTUMN:
                System.out.println("秋高气爽");
                break;
            case WINTER:
                System.out.println("冬雪皑皑");
                break;
        }
    }

    public static void test04() {
        // EnumSet是专门为枚举类设计的高效Set实现。它内部使用位向量表示，非常紧凑和高效。
        EnumSet<Season> seasons = EnumSet.allOf(Season.class);
        EnumSet<Season> warmSeasons = EnumSet.of(Season.SPRING, Season.SUMMER);
        EnumSet<Season> coldSeasons = EnumSet.complementOf(warmSeasons);

        // EnumMap是专门为枚举类设计的高效Map实现。它内部使用数组存储值，按键的自然顺序（枚举常量的声明顺序）维护。
        EnumMap<Season, String> seasonColors = new EnumMap<>(Season.class);
        seasonColors.put(Season.SPRING, "绿色");
        seasonColors.put(Season.SUMMER, "红色");
        seasonColors.put(Season.AUTUMN, "黄色");
        seasonColors.put(Season.WINTER, "白色");

        System.out.println("请断点调试");
    }

    public enum Season {
        // 枚举常量通常使用全大写字母命名，这是Java中的命名惯例，表明它们是常量值
        SPRING, SUMMER, AUTUMN, WINTER
    }
}
